package com.gqh.weather.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gqh.weather.auth.UserContext;
import com.gqh.weather.auth.UserInfo;
import com.gqh.weather.domain.dto.MyPage;
import com.gqh.weather.domain.dto.PcSubTaskListDataDTO;
import com.gqh.weather.domain.entity.PcSubtask;
import com.gqh.weather.exception.Result;
import com.gqh.weather.service.PcSubtaskService;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 子任务管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/pingjia/zh/v1/pc_subtask")
@Validated
public class PcSubtaskController {

    @Autowired
    private PcSubtaskService pcSubtaskService;

//    /**
//     * 修改PC子任务信息
//     *
//     * @param id PC子任务ID
//     * @param type 阅卷任务类型(0不阅卷1阅卷)
//     * @param schedule 日程
//     * @return 修改结果
//     */
//    @PostMapping("/update")
//    public Result<Void> updatePcSubtask(
//            @RequestParam @NotNull Integer id,
//            @RequestParam @NotNull Integer type,
//            @RequestParam @NotNull String schedule) {
//        log.info("更新PC子任务，ID: {}", id);
//        try {
//            PcSubtask pcSubtask = new PcSubtask();
//            pcSubtask.setId(id);
//            pcSubtask.setType(type);
//            pcSubtask.setSchedule(schedule);
//
//            boolean success = pcSubtaskService.updateById(pcSubtask);
//            if (success) {
//                return Result.success(null);
//            } else {
//                return Result.error("更新PC子任务失败");
//            }
//        } catch (Exception e) {
//            log.error("更新PC子任务失败", e);
//            return Result.error("系统错误");
//        }
//    }

    /**
     * 修改PC子任务状态
     *
     * @param id    PC子任务ID
     * @param state 状态：0未发布 1已发布 2结束
     * @return 修改结果
     */
    @PostMapping("/state")
    public Result<Void> updatePcSubtaskState(@RequestParam @NotNull Integer id,
                                             @RequestParam @NotNull Integer state) {
        log.info("修改PC子任务状态，ID: {}, 状态: {}", id, state);
        try {
            // 验证状态参数
            if (state < 0 || state > 2) {
                return Result.error("状态参数错误");
            }

            // 更新状态
            boolean success = pcSubtaskService.updatePcSubtaskState(id, state);
            
            if (success) {
                return Result.success(null);
            } else {
                return Result.error("修改PC子任务状态失败");
            }
        } catch (Exception e) {
            log.error("修改PC子任务状态失败", e);
            return Result.error("系统错误");
        }
    }

    /**
     * PC子任务列表查询
     *
     * @param page 页码
     * @param count 每页数量
     * @param keyword 关键字
     * @return 查询结果
     */
    @GetMapping("/list")
    public Result<MyPage<PcSubTaskListDataDTO>> getPcSubtaskList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "20") Integer count,
            @RequestParam(required = false) String keyword) {
        log.info("查询PC子任务列表，页码: {}, 数量: {}, 关键字: {}", page, count, keyword);
        try {
            // 获取当前用户ID
            UserInfo currentUser = UserContext.getCurrentUser();
            Integer uid = currentUser.getUid();
            
            // 调用服务方法获取列表数据
            MyPage<PcSubTaskListDataDTO> result = pcSubtaskService.getPcSubtaskList(page, count, keyword, uid);
            return Result.success(result);
        } catch (Exception e) {
            log.error("查询PC子任务列表失败", e);
            return Result.error("查询失败");
        }
    }

    /**
     * PC子任务详情查询
     *
     * @param id PC子任务ID
     * @return PC子任务详情
     */
    @GetMapping("/info")
    public Result<PcSubTaskListDataDTO> getPcSubtaskInfo(@RequestParam @NotNull Integer id) {
        log.info("获取PC子任务详情，ID: {}", id);
        try {
            PcSubTaskListDataDTO pcSubtask = pcSubtaskService.getPcSubtaskInfo(id);
            if (pcSubtask == null) {
                return Result.error("PC子任务不存在");
            }
            return Result.success(pcSubtask);
        } catch (Exception e) {
            log.error("获取PC子任务详情失败", e);
            return Result.error("查询失败");
        }
    }
    
    /**
     * 导出学业成绩
     *
     * @param id PC子任务ID
     * @param citycode 城市码
     * @return 导出结果
     */
    @PostMapping("/export_score")
    public Result<String> exportScore(@RequestParam @NotNull Integer id,
                                      @RequestParam(required = false) String citycode) {
        log.info("导出学业成绩，ID: {}, 城市码: {}", id, citycode);
        try {
            // 获取当前用户信息
            UserInfo currentUser = UserContext.getCurrentUser();
            if (citycode == null || citycode.isEmpty()) {
                citycode = currentUser.getCitycode();
            }
            
            // 调用服务方法导出成绩
            String url = pcSubtaskService.exportScore(id, citycode, false);
            return Result.success(url);
        } catch (Exception e) {
            log.error("导出学业成绩失败，ID: " + id, e);
            return Result.error("导出学业成绩失败: " + e.getMessage());
        }
    }
    
//    /**
//     * 导出心理成绩
//     *
//     * @param id PC子任务ID
//     * @param citycode 城市码
//     * @return 导出结果
//     */
//    @PostMapping("/export_psyc_score")
//    public Result<String> exportPsycScore(@RequestParam @NotNull Integer id,
//                                          @RequestParam(required = false) String citycode) {
//        log.info("导出心理成绩，ID: {}, 城市码: {}", id, citycode);
//        try {
//            // 获取当前用户信息
//            UserInfo currentUser = UserContext.getCurrentUser();
//            if (citycode == null || citycode.isEmpty()) {
//                citycode = currentUser.getCitycode();
//            }
//
//            // 调用服务方法导出成绩
//            String url = pcSubtaskService.exportScore(id, citycode, true);
//            return Result.success(url);
//        } catch (Exception e) {
//            log.error("导出心理成绩失败，ID: " + id, e);
//            return Result.error("导出心理成绩失败: " + e.getMessage());
//        }
//    }
    
//    /**
//     * 主观题上传情况列表
//     *
//     * @param id PC子任务ID
//     * @param paper_type 学科类型
//     * @param page 页码
//     * @param count 每页数量
//     * @param upload_state 上传状态
//     * @param school_id 学校ID
//     * @param citycode 城市码
//     * @param keyword 关键字
//     * @return 主观题上传情况列表
//     */
//    @GetMapping("/subjective/upload_list")
//    public Result<String> subjectiveUploadList(
//            @RequestParam("id") @NotNull Integer id,
//            @RequestParam("paper_type") @NotNull Integer paperType,
//            @RequestParam(required = false, defaultValue = "1") Integer page,
//            @RequestParam(required = false, defaultValue = "20") Integer count,
//            @RequestParam(required = false, name = "upload_state") Integer uploadState,
//            @RequestParam(required = false, name = "school_id") Integer schoolId,
//            @RequestParam(required = false) String citycode,
//            @RequestParam(required = false) String keyword) {
//        log.info("获取主观题上传情况列表，ID: {}, 学科: {}, 页码: {}, 数量: {}", id, paperType, page, count);
//        // TODO: 实现主观题上传情况列表逻辑
//        return Result.success("主观题上传情况列表功能待实现");
//    }
//
//    /**
//     * 主观题上传情况记录删除
//     *
//     * @param scan_id 扫描记录ID
//     * @return 删除结果
//     */
//    @PostMapping("/subjective/delete")
//    public Result<Void> subjectiveDelete(@RequestParam("scan_id") @NotNull String scanId) {
//        log.info("删除主观题上传记录，扫描ID: {}", scanId);
//        // TODO: 实现主观题上传情况记录删除逻辑
//        return Result.success(null);
//    }
    
//    /**
//     * 答题卡生成状态
//     *
//     * @param id PC子任务ID
//     * @return 答题卡生成状态
//     */
//    @GetMapping("/answer_sheet_state")
//    public Result<Map<String, Object>> getAnswerSheetState(@RequestParam @NotNull Integer id) {
//        log.info("获取答题卡生成状态，ID: {}", id);
//        try {
//            Map<String, Object> state = pcSubtaskService.getAnswerSheetState(id);
//            return Result.success(state);
//        } catch (Exception e) {
//            log.error("获取答题卡生成状态失败，ID: " + id, e);
//            return Result.error("获取答题卡生成状态失败: " + e.getMessage());
//        }
//    }
}